@file:Suppress("unused")

package com.virtualightning.mvvm.tools

import androidx.lifecycle.*

/**
 *  Anchor : Create by CimZzz
 *  Time : 2021/3/16 17:46:22
 *  Project : zxs-new
 *  简易的生命周期
 */
class TinyLifecycle : LifecycleOwner, ViewModelStoreOwner {
    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/3/16 下午5:51
    // Lifecycle 注册处
    ///////////////////////////////////////////////////////////////////////////
    private var lifecycleRegistry: LifecycleRegistry? = null

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/3/16 下午6:06
    // 延迟实例化 Lifecycle 注册处
    ///////////////////////////////////////////////////////////////////////////
    private fun getRegistry(): LifecycleRegistry {
        val registry = lifecycleRegistry ?: LifecycleRegistry(this)
        if(lifecycleRegistry == null) {
            lifecycleRegistry = registry
        }
        return registry
    }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/3/16 下午5:51
    // 获取当前 Lifecycle
    ///////////////////////////////////////////////////////////////////////////
    override fun getLifecycle(): Lifecycle = getRegistry()

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/3/16 下午6:07
    // ViewModelStore
    ///////////////////////////////////////////////////////////////////////////
    private var viewModelStore: ViewModelStore? = null

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/3/16 下午6:01
    // ViewModel 提供者
    ///////////////////////////////////////////////////////////////////////////
    private var viewModelProvider : ViewModelProvider? = null

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/3/16 下午6:11
    // 获取 ViewModelProvider
    ///////////////////////////////////////////////////////////////////////////
    fun getViewModelProvider(): ViewModelProvider {
        val provider = viewModelProvider ?: ViewModelProvider(this)
        if(viewModelProvider == null) {
            viewModelProvider = provider
        }
        return provider
    }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/3/16 下午6:09
    // 获取 ViewModelStore
    ///////////////////////////////////////////////////////////////////////////
    override fun getViewModelStore(): ViewModelStore {
        val store = viewModelStore ?: ViewModelStore()
        if(viewModelStore == null) {
            viewModelStore = store
        }
        return store
    }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/3/16 下午5:50
    // 切换当前 Lifecycle 状态
    ///////////////////////////////////////////////////////////////////////////
    fun setLifeState(state: Lifecycle.State) {
        val registry = getRegistry()
        if(registry.currentState == Lifecycle.State.DESTROYED) {
            return
        }
        registry.currentState = state
        if(registry.currentState == Lifecycle.State.DESTROYED) {
            viewModelStore?.clear()
        }
    }


    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/1/25 下午4:01
    // 找到对应的 ViewModel
    ///////////////////////////////////////////////////////////////////////////
    inline fun <reified T : ViewModel> findViewModel(key: String? = null) : T {
        return if(key == null) {
            getViewModelProvider()[T::class.java]
        }
        else {
            getViewModelProvider()[key, T::class.java]
        }
    }
}